package main

import (
	"endow/cfg"
	"endow/img"
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
)

var (
    path,
    urls,
    name,
    fileUrls,
    iniCfgFile,
    logFile string

    doConvert,
    doCrop,
    doScale,
    doSquare,
    override,
    localSave bool
)

func init() {
    flag.StringVar(&path, "p", "", "Куда складывать картинки")
    flag.StringVar(&urls, "u", "", "Список ссылок на картинки, разделённых пробелом, прим: -u='https://link1.png https://link/2.webm'")
    flag.StringVar(&name, "n", "", "Шаблон, по которому будут именоваться файлы. Например, если задать 'result', то имена файлов будут 'result-01.jpg', 'result-02.jpg' и т.д.")
    flag.StringVar(&fileUrls, "f", "", "Файл, откуда программа будет брать ссылки, разделённые символом новой строки")
    flag.StringVar(&iniCfgFile, "cfg", "", "Использует конфиг-файл")
    flag.StringVar(&logFile, "d", "", "Если ввести имя файла, то программа будет логгировать каждый шаг в указанный файл.")

    flag.BoolVar(&doConvert, "jpg", false, "Нужно ли конверитировать в jpg?")
    flag.BoolVar(&doCrop, "crop", false, "Нужно ли делать обрезку?")
    flag.BoolVar(&doScale, "scale", false, "Большая сторона масштабируется до 600 пикселей, другая сторона в столько же раз, что и большой")
    flag.BoolVar(&doSquare, "square", false, "Сделать картинку квадратной, отцентрировав контент посередине")
    flag.BoolVar(&override, "y", false, "Перезаписывать файлы")
    flag.BoolVar(&localSave, "l", false, "Использовать локальные файлы")
    flag.Parse()
}

func main() {
    var (
        urlList []string
        err error
        fileLog *os.File
    )
    if urls == "" && iniCfgFile == "" {
        urlList, err = cfg.ParseFileURLs(fileUrls)

        if err != nil {
            panic(err)
        }
    } else {
        urlList = strings.Split(urls, " ")
    }

    if iniCfgFile != "" {
        name, path, logFile, urlList, doConvert, doCrop, doScale, doSquare, override, localSave = cfg.LoadConfig(iniCfgFile)
    }

    if logFile != "" {
        fileLog, err = os.Create(logFile)
        if err != nil {
            log.Fatalf("Ошибка при создании файла:\n%v\n", err)
        }

        log.SetOutput(fileLog)
        log.Println("Вывод лога перенаправлен в файл")
    }

    log.Printf(
        "[Операции редактирования]\n\tКонвертация: %v\n\tОбрезка: %v\n\tМасштабирование: %v\n\tХолст квадраный: %v\n\tПерезапись файлов: %v\n\tИспользовать локальные файлы: %v\n\n",
        doConvert, doCrop, doScale, doSquare, override, localSave,
    )

    for i, item := range urlList {
        pic := img.NewImg(item, path, name, i)
        
        log.Printf("[Картинка № %d]\n\tПолное имя: %s\n\tСсылка: %s\n\n", i, pic.FullPath, pic.Link)
        fmt.Printf("\n[%d]>\n", i)
        if !localSave {
            err = pic.DownloadImage(override)            
        } else {
            err = pic.LocalCopyImage(override)
        }
        if err != nil {
            log.Print(err)
            continue
        }
        fmt.Println("\tИзображение скачано")

        log.Printf("Расширение: %s\n", pic.Extension)

        if doConvert {
            err = pic.ConvertToJPEG(override)
            if err == nil {
                fmt.Println("\tИзображение конвертировано")
            }
        }

        if doCrop {
            pic.TrimImage()
            fmt.Println("\tИзображение обрезано")
        }

        if doScale {
            pic.Scale()
            fmt.Println("\tИзображение масштабировано")
        }

        if doSquare {
            pic.MakeSquare()
            fmt.Println("\tКонтент изображения отцентрован и размеры картинки совпадают")
        }

        fmt.Println("\tКартинка готова")
        log.Println()
    }

    if logFile != "" {
        fileLog.Close()
    }
}

